package com.sardine.base.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 北京京东世纪贸易有限公司<br>
 * Created with IntelliJ IDEA.
 * Date:2015/10/18
 * Time:12:12
 *
 * @author daifeng<br>
 *         daifeng@jd.com
 * @since JDK 1.6 <br>
 * Copyright (c) 2015 JD System Incorporated All Rights Reserved.
 */
public class DateUtils {
    /**
     * 格式为：yyyy-MM-dd HH:mm:ss.SSS
     */
    public static final String DATE_MODEL_1 = "yyyy-MM-dd HH:mm:ss.SSS";
    /**
     * 格式为：yyyy-MM-dd HH:mm:ss
     */
    public static final String DATE_MODEL_2 = "yyyy-MM-dd HH:mm:ss";
    /**
     * 格式为：yyyy-MM-dd HH:mm
     */
    public static final String DATE_MODEL_3 = "yyyy-MM-dd HH:mm";
    /**
     * 格式为：yyyy-MM-dd HH
     */
    public static final String DATE_MODEL_4 = "yyyy-MM-dd HH";
    /**
     * 格式为：yyyy-MM-dd
     */
    public static final String DATE_MODEL_5 = "yyyy-MM-dd";
    /**
     * 格式为：yyyy-MM
     */
    public static final String DATE_MODEL_6 = "yyyy-MM";

    /**
     * 格式为：yyyyMMddHHmmss.SSS
     */
    public static final String DATE_MODEL_7 = "yyyyMMddHHmmss.SSS";
    /**
     * 格式为：yyyyMMddHHmmss
     */
    public static final String DATE_MODEL_8 = "yyyyMMddHHmmss";
    /**
     * 格式为：yyyyMMddHHmm
     */
    public static final String DATE_MODEL_9 = "yyyyMMddHHmm";
    /**
     * 格式为：yyyyMMddHH
     */
    public static final String DATE_MODEL_10 = "yyyyMMddHH";
    /**
     * 格式为：yyyyMMdd
     */
    public static final String DATE_MODEL_11 = "yyyyMMdd";
    /**
     * 格式为：yyyyMM
     */
    public static final String DATE_MODEL_12 = "yyyyMM";

    /**
     * 格式为：yyyy/MM/dd HH:mm:ss.SSS
     */
    public static final String DATE_MODEL_13 = "yyyy/MM/dd HH:mm:ss.SSS";
    /**
     * 格式为：yyyy/MM/dd HH:mm:ss
     */
    public static final String DATE_MODEL_14 = "yyyy/MM/dd HH:mm:ss";
    /**
     * 格式为：yyyy/MM/dd HH:mm
     */
    public static final String DATE_MODEL_15 = "yyyy/MM/dd HH:mm";
    /**
     * 格式为：yyyy/MM/dd HH
     */
    public static final String DATE_MODEL_16 = "yyyy/MM/dd HH";
    /**
     * 格式为：yyyy/MM/dd
     */
    public static final String DATE_MODEL_17 = "yyyy/MM/dd";
    /**
     * 格式为：yyyy/MM
     */
    public static final String DATE_MODEL_18 = "yyyy/MM";

    /**
     * 格式为：yyyy
     */
    public static final String DATE_MODEL_19 = "yyyy";

    /**
     * 每秒毫秒数
     */
    public static final int MILLISECONDS_PER_SECONDE = 1000;
    /**
     * 每分毫秒数
     */
    public static final int MILLISECONDS_PER_MINUTE = 60000; // 60*1000
    /**
     * 每小时毫秒数
     */
    public static final int MILLISECONDS_PER_HOUR = 3600000; // 36*60*1000
    /**
     * 每天毫秒数
     */
    public static final long MILLISECONDS_PER_DAY = 86400000;// 24*60*60*1000;


    public static Date getCurrentDate() {
        return new Date(System.currentTimeMillis());
    }

    /**
     * 转换日期格式
     * @param date
     * @return
     * @throws Exception
     */
    public static Date tranferDateFormat(Date date,String format){
        try{
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            String s = sdf.format(date);
            return sdf.parse(s);
        }catch (Exception e){
            return date;
        }

    }


    /**
     * 到下一分钟0秒的毫秒数
     *
     * @param rightnow
     *         当前时间
     * @return the int 到下一分钟的毫秒数
     */
    public static int getDelayToNextMinute(long rightnow) {
        return (int) (MILLISECONDS_PER_MINUTE - (rightnow % MILLISECONDS_PER_MINUTE));
    }

    /**
     * 上一分钟的最后一毫秒
     *
     * @param rightnow
     *         当前时间
     * @return 上一分钟的最后一毫秒
     */
    public static long getPreMinuteMills(long rightnow) {
        return rightnow - (rightnow % MILLISECONDS_PER_MINUTE) - 1;
    }

    /**
     * 得到时间字符串
     *
     * @param date
     *         时间
     * @return 时间字符串
     */
    public static String dateToStr(Date date) {
        return dateToStr(date, DATE_MODEL_2);
    }

    /**
     * 时间转字符串
     *
     * @param date
     *         时间
     * @param format
     *         格式化格式
     * @return 时间字符串
     */
    public static String dateToStr(Date date, String format) {
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 字符串转时间
     *
     * @param dateStr
     *         时间字符串
     * @return 时间字符串
     */
    public static Date strToDate(String dateStr) throws ParseException {
        return strToDate(dateStr, DATE_MODEL_2);
    }

    /**
     * 字符串转时间
     *
     * @param dateStr
     *         时间字符串
     * @param format
     *         格式化格式
     * @return 时间字符串
     */
    public static Date strToDate(String dateStr, String format) throws ParseException {
        return new SimpleDateFormat(format).parse(dateStr);
    }

    /**
     * 得到毫秒级时间字符串
     *
     * @param date
     *         时间
     * @return 时间字符串
     */
    public static String dateToMillisStr(Date date) {
        return dateToStr(date, DATE_MODEL_1);
    }

    /**
     * 得到Date
     *
     * @param millisDateStr
     *         毫秒级时间字符串
     * @return Date
     */
    public static Date millisStrToDate(String millisDateStr) throws ParseException {
        return strToDate(millisDateStr, DATE_MODEL_1);
    }

    /**
     * 获取日期格式
     * @param dateStr   日期字符串
     * @return  日期格式
     */
    public static String getFormat(String dateStr) {
        String result = null;
        if (dateStr.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d+")) {
            result = DATE_MODEL_1;
        } else if (dateStr.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
            result = DATE_MODEL_2;
        } else if (dateStr.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}")) {
            result = DATE_MODEL_3;
        } else if (dateStr.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}")) {
            result = DATE_MODEL_4;
        } else if (dateStr.matches("\\d{4}-\\d{2}-\\d{2}")) {
            result = DATE_MODEL_5;
        } else if (dateStr.matches("\\d{4}-\\d{2}")) {
            result = DATE_MODEL_6;
        } else if (dateStr.matches("\\d{14}.\\d+")) {
            result = DATE_MODEL_7;
        } else if (dateStr.matches("\\d{14}")) {
            result = DATE_MODEL_8;
        } else if (dateStr.matches("\\d{12}")) {
            result = DATE_MODEL_9;
        } else if (dateStr.matches("\\d{10}")) {
            result = DATE_MODEL_10;
        } else if (dateStr.matches("\\d{8}")) {
            result = DATE_MODEL_11;
        } else if (dateStr.matches("\\d{6}")) {
            result = DATE_MODEL_12;
        } else if (dateStr.matches("\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d+")) {
            result = DATE_MODEL_13;
        } else if (dateStr.matches("\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
            result = DATE_MODEL_14;
        } else if (dateStr.matches("\\d{4}/\\d{2}/\\d{2} \\d{2}:\\d{2}")) {
            result = DATE_MODEL_15;
        } else if (dateStr.matches("\\d{4}/\\d{2}/\\d{2} \\d{2}")) {
            result = DATE_MODEL_16;
        } else if (dateStr.matches("\\d{4}/\\d{2}/\\d{2}")) {
            result = DATE_MODEL_17;
        } else if (dateStr.matches("\\d{4}/\\d{2}")) {
            result = DATE_MODEL_18;
        }
        return result;
    }

    /**
     * 日期转字符串
     * @param date  日期时间
     * @param format    格式化字符串
     * @return  日期字符串
     */
    public static String format(Date date, String format) {
        if(date == null){
            return null;
        }
        String resultStr = "";
        String formatTemp = format;
        if(formatTemp == null || "".equals(formatTemp)){
            formatTemp = DATE_MODEL_5;
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat(formatTemp);

        resultStr = dateFormat.format(date).trim();

        return resultStr;
    }

    /**
     * 字符串转日期
     * @param dateStr   日期字符串
     * @param format    转换格式
     * @return  日期时间
     * @throws ParseException
     */
    public static Date parse(String dateStr, String format) throws ParseException {
        String formatTemp = format;
        if(formatTemp == null || "".equals(formatTemp)){
            formatTemp = DATE_MODEL_5;
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat(formatTemp);
        return dateFormat.parse(dateStr);
    }

    /**
     * 字符串转日期，自动适配字符串格式
     * @param dateStr 日期字符串
     * @return
     * @throws ParseException
     */
    public static Date parse (String dateStr) throws ParseException {
        String format = getFormat(dateStr);
        return parse(dateStr, format);
    }

    /**
     * 增加日期中某类型的某数值。如增加日期
     *
     * @param date     日期
     * @param dateType 类型
     * @param amount   数值
     * @return 计算后日期
     */
    private static Date addInteger(Date date, int dateType, int amount) {
        Date myDate = null;
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(dateType, amount);
            myDate = calendar.getTime();
        }
        return myDate;
    }
    /**
     * 增加日期的小时。失败返回null。
     *
     * @param date       日期
     * @param minuteAmount 增加数量
     * @return 增加小时后的日期
     */
    public static Date addMinute(Date date, int minuteAmount) {
        return addInteger(date, Calendar.MINUTE, minuteAmount);
    }

    /**
     * 增加日期。失败返回null。
     *
     * @param date       日期
     * @param paramInt 增加数量
     * @return 增加日期后的日期
     */
    public static Date addDays(Date date, int paramInt)
            throws Exception {
        Calendar localCalendar = Calendar.getInstance();
        localCalendar.setTime(date);
        int i = localCalendar.get(6);
        localCalendar.set(6, i + paramInt);
        return localCalendar.getTime();
    }

    /**
     * 查询下一年的时间
     * @return
     */
    public static Date getNextYear(){
        try {
            Calendar localCalendar = Calendar.getInstance();
            int year = localCalendar.get(Calendar.YEAR);
            String dateStr=(year+1) +"-12-31 23:59:59";
            return strToDate(dateStr);
        } catch (ParseException e) {

        }
        return null;
    }

    /**
     * 判断日期是否为当天
     * @param date
     * @return
     */
    public static boolean isToday(Date date){
        String dateString = DateUtils.format(date, DATE_MODEL_11);
        String today = DateUtils.format(new Date(),DATE_MODEL_11);
        return today.equals(dateString);
    }
}
